package com.zzyy.dtx.pay.controller;

import com.zzyy.dtx.order.api.OrderApi;
import com.zzyy.dtx.order.dto.OrderDTO;
import com.zzyy.dtx.pay.dto.PayDTO;
import com.zzyy.dtx.pay.entities.Pay;
import com.zzyy.dtx.pay.service.PayService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @auther zzyy
 * @create 2023-04-16 16:29
 */
@Controller
public class PayController {

    @Autowired
    private PayService payService;
    @Autowired
    private OrderApi orderApi;


    /**
     * 第一步，查找所有的订单信息, 订单list页面在orderList.html
     * 默认状态下，在该页面的最右侧，点击【支付】按钮会调用createPayForm方法并跳转到payForm.html页面
     * @param modelMap
     * @return
     */
    @RequestMapping(value = "/orderList",method = RequestMethod.GET)
    public String getOrderList(ModelMap modelMap)
    {
        List<OrderDTO> orderDTOList = this.orderApi.orderList();

        if (orderDTOList != null) {
            modelMap.addAttribute("orderList",orderDTOList);
        }
        return "orderList";//src/main/resources/templates/orderList.html
    }

    /**2023.5.14
     * 第二步，跳转到支付方式选择页面payForm.html，选择任意一种支付方式(余额、微信、支付宝)
     * @param orderNo 订单号，不是支付号
     * @return
     */
    @RequestMapping(value = "/pay/create/{orderNo}", method = RequestMethod.GET)
    public String createPayForm(@PathVariable String orderNo, ModelMap modelMap)
    {
        // 按照订单流水号先做幂等性判断，先判断支付订单是否存在，tx_pay表里面是否有数据
        Pay pay = this.payService.findPayByOrderNo(orderNo);

        if(pay != null) {
            //tx_pay表里面的`status`字段， 支付状态 -1：取消 0 未完成 1已完成 -2:异常',

            //1.1 tx_pay表里面状态是否是零，表没支付。
            if(pay.getStatus().byteValue() == 0) {
                //未支付：跳转到支付确认页面
                return "redirect:/pay/confirmPay/"+pay.getPayNo();
            }else if(pay.getStatus().byteValue() == 1){
                // 已支付，提示，已经支付
                throw new RuntimeException("已经付款成功");
            }else{
                // 其它情况抛出异常
                throw new RuntimeException("抛出其它支付异常-1 or -2");
            }
        }
        //2 没有生成过支付订单(tx_pay表为null)，通过订单号码查订单信息
        OrderDTO orderDTO = this.orderApi.findOrderNo(orderNo);

        PayDTO payDTO = new PayDTO();
        payDTO.setOrderNo(orderDTO.getOrderNo());
        payDTO.setAmount(orderDTO.getPaymentMoney());
        payDTO.setUserId(orderDTO.getUserId());

        modelMap.addAttribute("pay",payDTO);

        //3 直接支付,跳转到支付页面payForm.html，有支付二维码图片的页面
        return "payForm"; //src/main/resources/templates/payForm.html
    }


    /**2023.5.21
     * 第三步，在当前支付页面payForm.html择任意一种支付方式(余额、微信、支付宝)点击【去支付按钮】
     * 就跳转进入支付二维码payConfirmForm.html
     * @param payDTO
     * @return
     */
    @RequestMapping(value = "/pay/create", method = RequestMethod.POST)
    public String create(@ModelAttribute PayDTO payDTO){
        //幂等性校验，先判断支付订单tx_pay表里是否有记录
        Pay pay=this.payService.findPayByOrderNo(payDTO.getOrderNo());
        //已存在
        if(pay!=null){
            //再判断是否已支付tx_pay表里status字段是否为零,- 支付状态 -1：取消 0 未完成 1已完成 -2:异常
            if(pay.getStatus().byteValue()==0){
                //未支付:跳到支付确认页面,页面是payConfirmForm.html
                return  "redirect:/pay/confirmPay/"+pay.getPayNo();
            }else if(pay.getStatus().byteValue()==1){
                //已支付:提示，已支付
                throw new RuntimeException("已付款成功！！");
            }else{
                //其它情况抛出异常
                throw new RuntimeException("抛出支付异常！！");
            }
        }else{
            //不存在
            //支付订单创建tx_pay表新增记录后跳转进入支付二维码payConfirmForm.html,即调用了第四步/pay/confirmPay/{payNo}接口
            String payno=this.payService.createPay(payDTO);
            return  "redirect:/pay/confirmPay/"+payno;
        }
    }

    /**2023.5.21
     * 第四步，支付订单创建已成功(tx_pay表已有记录)，跳转进入支付二维码payConfirmForm.html该接口是一个渲染页面接口
     * @param payNo
     * @param modelMap
     * @return
     */
    @RequestMapping(value = "/pay/confirmPay/{payNo}", method = RequestMethod.GET)
    public String confirmPayForm(@PathVariable String payNo, ModelMap modelMap) {
        //通过支付流水号，找出支付订单的信息
        Pay pay = this.payService.findPayByPayNo(payNo);
        PayDTO payDTO = new PayDTO();
        BeanUtils.copyProperties(pay,payDTO);
        modelMap.addAttribute("pay",payDTO);
        return "payConfirmForm"; //src/main/resources/templates/payConfirmForm.html
    }


    /**2023.5.21
     * 第五步，在点击"模拟支付"按钮后，进入分布式事务，先处理本地事务，后在处理MQ及其他事务
     * @param payNo
     * @return
     */
    @RequestMapping(value = "/confirmPay",method = RequestMethod.POST)
    public String confirmPay(@RequestParam("payNo") String payNo){
        this.payService.confirmPayHandle(payNo);
        return  "redirect:/orderList";
    }

}

